package com.cencat.route.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cencat.route.entity.RouteInvoice;
import com.cencat.route.vo.RouteInvoiceVO;
import com.cencat.route.dto.RouteInvoiceDTO;
import com.cencat.route.dto.RouteInvoiceQueryDTO;
import com.cencat.route.dto.RouteInvoiceBatchUpdateDTO;
import com.cencat.route.dto.RouteInvoiceStatisticsDTO;
import jakarta.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 路线发票管理服务接口
 * 提供发票的增删改查、统计分析、税务分析、合规性检查等功能
 * 
 * @author cencat
 * @version 1.0
 * @since 2025-01-20
 */
public interface RouteInvoiceService {

    /**
     * 分页查询发票列表
     * 
     * @param page 分页参数
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    Page<RouteInvoiceVO> getInvoiceList(Page<RouteInvoice> page, RouteInvoiceQueryDTO queryDTO);

    /**
     * 根据ID获取发票详情
     * 
     * @param id 发票ID
     * @return 发票详情
     */
    RouteInvoiceVO getInvoiceById(@NotNull Long id);

    /**
     * 创建新发票
     * 
     * @param invoiceDTO 发票信息
     * @return 创建结果
     */
    Boolean createInvoice(@NotNull RouteInvoiceDTO invoiceDTO);

    /**
     * 更新发票信息
     * 
     * @param id 发票ID
     * @param invoiceDTO 发票信息
     * @return 更新结果
     */
    Boolean updateInvoice(@NotNull Long id, @NotNull RouteInvoiceDTO invoiceDTO);

    /**
     * 删除发票
     * 
     * @param id 发票ID
     * @return 删除结果
     */
    Boolean deleteInvoice(@NotNull Long id);

    /**
     * 批量删除发票
     * 
     * @param ids 发票ID列表
     * @return 删除结果
     */
    Boolean batchDeleteInvoices(@NotNull List<Long> ids);

    /**
     * 批量更新发票状态
     * 
     * @param batchUpdateDTO 批量更新参数
     * @return 更新结果
     */
    Boolean batchUpdateInvoiceStatus(@NotNull RouteInvoiceBatchUpdateDTO batchUpdateDTO);

    /**
     * 批量更新发票类型
     * 
     * @param ids 发票ID列表
     * @param invoiceType 发票类型
     * @return 更新结果
     */
    Boolean batchUpdateInvoiceType(@NotNull List<Long> ids, @NotNull String invoiceType);

    /**
     * 批量更新税率
     * 
     * @param ids 发票ID列表
     * @param taxRate 税率
     * @return 更新结果
     */
    Boolean batchUpdateTaxRate(@NotNull List<Long> ids, @NotNull Double taxRate);

    /**
     * 批量更新发票金额
     * 
     * @param ids 发票ID列表
     * @param amount 发票金额
     * @return 更新结果
     */
    Boolean batchUpdateAmount(@NotNull List<Long> ids, @NotNull Double amount);

    /**
     * 获取发票统计信息
     * 
     * @param statisticsDTO 统计参数
     * @return 统计结果
     */
    Map<String, Object> getInvoiceStatistics(@NotNull RouteInvoiceStatisticsDTO statisticsDTO);

    /**
     * 获取待开具发票
     * 
     * @param limit 数量限制
     * @return 待开具发票列表
     */
    List<RouteInvoiceVO> getPendingInvoices(@NotNull Integer limit);

    /**
     * 获取已开具发票
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 数量限制
     * @return 已开具发票列表
     */
    List<RouteInvoiceVO> getIssuedInvoices(@NotNull LocalDateTime startTime, @NotNull LocalDateTime endTime, 
                                           @NotNull Integer limit);

    /**
     * 获取已作废发票
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 数量限制
     * @return 已作废发票列表
     */
    List<RouteInvoiceVO> getCancelledInvoices(@NotNull LocalDateTime startTime, @NotNull LocalDateTime endTime, 
                                              @NotNull Integer limit);

    /**
     * 获取红冲发票
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 数量限制
     * @return 红冲发票列表
     */
    List<RouteInvoiceVO> getRedInvoices(@NotNull LocalDateTime startTime, @NotNull LocalDateTime endTime, 
                                        @NotNull Integer limit);

    /**
     * 获取待审核发票
     * 
     * @param limit 数量限制
     * @return 待审核发票列表
     */
    List<RouteInvoiceVO> getPendingAuditInvoices(@NotNull Integer limit);

    /**
     * 获取已审核发票
     * 
     * @param auditResult 审核结果
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 数量限制
     * @return 已审核发票列表
     */
    List<RouteInvoiceVO> getAuditedInvoices(@NotNull String auditResult, @NotNull LocalDateTime startTime, 
                                            @NotNull LocalDateTime endTime, @NotNull Integer limit);

    /**
     * 获取已认证发票
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 数量限制
     * @return 已认证发票列表
     */
    List<RouteInvoiceVO> getVerifiedInvoices(@NotNull LocalDateTime startTime, @NotNull LocalDateTime endTime, 
                                             @NotNull Integer limit);

    /**
     * 获取商户发票
     * 
     * @param merchantId 商户ID
     * @param status 状态
     * @param limit 数量限制
     * @return 商户发票列表
     */
    List<RouteInvoiceVO> getMerchantInvoices(@NotNull Long merchantId, String status, @NotNull Integer limit);

    /**
     * 获取路线发票
     * 
     * @param routeId 路线ID
     * @param status 状态
     * @param limit 数量限制
     * @return 路线发票列表
     */
    List<RouteInvoiceVO> getRouteInvoices(@NotNull Long routeId, String status, @NotNull Integer limit);

    /**
     * 检查发票是否存在
     * 
     * @param id 发票ID
     * @return 是否存在
     */
    Boolean existsById(@NotNull Long id);

    /**
     * 检查发票号码是否存在
     * 
     * @param invoiceNo 发票号码
     * @param excludeId 排除的发票ID
     * @return 是否存在
     */
    Boolean existsByInvoiceNo(@NotNull String invoiceNo, Long excludeId);

    /**
     * 检查发票代码是否存在
     * 
     * @param invoiceCode 发票代码
     * @param excludeId 排除的发票ID
     * @return 是否存在
     */
    Boolean existsByInvoiceCode(@NotNull String invoiceCode, Long excludeId);

    /**
     * 开具发票
     * 
     * @param invoiceId 发票ID
     * @param issueData 开具数据
     * @return 开具结果
     */
    Boolean issueInvoice(@NotNull Long invoiceId, @NotNull Map<String, Object> issueData);

    /**
     * 批量开具发票
     * 
     * @param invoiceIds 发票ID列表
     * @param issueData 开具数据
     * @return 开具结果
     */
    Boolean batchIssueInvoices(@NotNull List<Long> invoiceIds, @NotNull Map<String, Object> issueData);

    /**
     * 作废发票
     * 
     * @param invoiceId 发票ID
     * @param reason 作废原因
     * @return 作废结果
     */
    Boolean cancelInvoice(@NotNull Long invoiceId, @NotNull String reason);

    /**
     * 批量作废发票
     * 
     * @param invoiceIds 发票ID列表
     * @param reason 作废原因
     * @return 作废结果
     */
    Boolean batchCancelInvoices(@NotNull List<Long> invoiceIds, @NotNull String reason);

    /**
     * 红冲发票
     * 
     * @param invoiceId 发票ID
     * @param reason 红冲原因
     * @return 红冲结果
     */
    Boolean redInvoice(@NotNull Long invoiceId, @NotNull String reason);

    /**
     * 批量红冲发票
     * 
     * @param invoiceIds 发票ID列表
     * @param reason 红冲原因
     * @return 红冲结果
     */
    Boolean batchRedInvoices(@NotNull List<Long> invoiceIds, @NotNull String reason);

    /**
     * 审核发票
     * 
     * @param invoiceId 发票ID
     * @param auditResult 审核结果
     * @param auditRemark 审核备注
     * @return 审核结果
     */
    Boolean auditInvoice(@NotNull Long invoiceId, @NotNull String auditResult, String auditRemark);

    /**
     * 批量审核发票
     * 
     * @param invoiceIds 发票ID列表
     * @param auditResult 审核结果
     * @param auditRemark 审核备注
     * @return 审核结果
     */
    Boolean batchAuditInvoices(@NotNull List<Long> invoiceIds, @NotNull String auditResult, String auditRemark);

    /**
     * 认证发票
     * 
     * @param invoiceId 发票ID
     * @param verificationData 认证数据
     * @return 认证结果
     */
    Boolean verifyInvoice(@NotNull Long invoiceId, @NotNull Map<String, Object> verificationData);

    /**
     * 批量认证发票
     * 
     * @param invoiceIds 发票ID列表
     * @param verificationData 认证数据
     * @return 认证结果
     */
    Boolean batchVerifyInvoices(@NotNull List<Long> invoiceIds, @NotNull Map<String, Object> verificationData);

    /**
     * 获取发票税务分析
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param groupBy 分组方式
     * @return 税务分析结果
     */
    Map<String, Object> getTaxAnalysis(@NotNull LocalDateTime startTime, @NotNull LocalDateTime endTime, 
                                       @NotNull String groupBy);

    /**
     * 获取商户税务分析
     * 
     * @param merchantId 商户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 商户税务分析结果
     */
    Map<String, Object> getMerchantTaxAnalysis(@NotNull Long merchantId, @NotNull LocalDateTime startTime, 
                                               @NotNull LocalDateTime endTime);

    /**
     * 获取发票类型统计
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 发票类型统计结果
     */
    Map<String, Object> getInvoiceTypeStatistics(@NotNull LocalDateTime startTime, @NotNull LocalDateTime endTime);

    /**
     * 获取税率统计
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 税率统计结果
     */
    Map<String, Object> getTaxRateStatistics(@NotNull LocalDateTime startTime, @NotNull LocalDateTime endTime);

    /**
     * 获取发票金额统计
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param groupBy 分组方式
     * @return 发票金额统计结果
     */
    Map<String, Object> getAmountStatistics(@NotNull LocalDateTime startTime, @NotNull LocalDateTime endTime, 
                                             @NotNull String groupBy);

    /**
     * 获取发票状态统计
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 发票状态统计结果
     */
    Map<String, Object> getStatusStatistics(@NotNull LocalDateTime startTime, @NotNull LocalDateTime endTime);

    /**
     * 发票合规性检查
     * 
     * @param invoiceId 发票ID
     * @return 合规性检查结果
     */
    Map<String, Object> checkCompliance(@NotNull Long invoiceId);

    /**
     * 批量发票合规性检查
     * 
     * @param invoiceIds 发票ID列表
     * @return 合规性检查结果
     */
    Map<String, Object> batchCheckCompliance(@NotNull List<Long> invoiceIds);

    /**
     * 发票风险评估
     * 
     * @param invoiceId 发票ID
     * @return 风险评估结果
     */
    Map<String, Object> assessRisk(@NotNull Long invoiceId);

    /**
     * 发票真伪验证
     * 
     * @param invoiceNo 发票号码
     * @param invoiceCode 发票代码
     * @param checkCode 校验码
     * @return 验证结果
     */
    Boolean verifyAuthenticity(@NotNull String invoiceNo, @NotNull String invoiceCode, @NotNull String checkCode);

    /**
     * 生成发票报表
     * 
     * @param reportType 报表类型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param parameters 报表参数
     * @return 报表数据
     */
    Map<String, Object> generateReport(@NotNull String reportType, @NotNull LocalDateTime startTime, 
                                       @NotNull LocalDateTime endTime, Map<String, Object> parameters);

    /**
     * 导出发票数据
     * 
     * @param queryDTO 查询条件
     * @return 导出数据
     */
    List<RouteInvoiceVO> exportInvoices(@NotNull RouteInvoiceQueryDTO queryDTO);

    /**
     * 导入发票数据
     * 
     * @param invoices 发票数据列表
     * @return 导入结果
     */
    Boolean importInvoices(@NotNull List<RouteInvoiceDTO> invoices);

    /**
     * 发票数据同步
     * 
     * @param invoiceId 发票ID
     * @param syncType 同步类型
     * @return 同步结果
     */
    Boolean syncInvoiceData(@NotNull Long invoiceId, @NotNull String syncType);

    /**
     * 批量发票数据同步
     * 
     * @param invoiceIds 发票ID列表
     * @param syncType 同步类型
     * @return 同步结果
     */
    Boolean batchSyncInvoiceData(@NotNull List<Long> invoiceIds, @NotNull String syncType);

    /**
     * 发票自动开具
     * 
     * @param routeId 路线ID
     * @param autoIssueConfig 自动开具配置
     * @return 自动开具结果
     */
    Boolean autoIssueInvoice(@NotNull Long routeId, @NotNull Map<String, Object> autoIssueConfig);

    /**
     * 发票定时任务处理
     * 
     * @param taskType 任务类型
     * @param parameters 任务参数
     * @return 处理结果
     */
    Boolean processScheduledTask(@NotNull String taskType, Map<String, Object> parameters);

    /**
     * 发票异常处理
     * 
     * @param invoiceId 发票ID
     * @param exceptionType 异常类型
     * @param handleAction 处理动作
     * @return 处理结果
     */
    Boolean handleException(@NotNull Long invoiceId, @NotNull String exceptionType, @NotNull String handleAction);

    /**
     * 发票备份
     * 
     * @param backupType 备份类型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 备份结果
     */
    Boolean backupInvoices(@NotNull String backupType, @NotNull LocalDateTime startTime, 
                           @NotNull LocalDateTime endTime);

    /**
     * 发票恢复
     * 
     * @param backupId 备份ID
     * @param restoreType 恢复类型
     * @return 恢复结果
     */
    Boolean restoreInvoices(@NotNull Long backupId, @NotNull String restoreType);
}